
#include <vector_types.h>
#include <math_functions.h>

struct Particula {
    float3 velocidade;
    float massaEspecifica;
    float pressao;
    float3 forcaPressao;
    float3 forcaVisc;
    float3 forcaAceleracao;
};

__global__ void VelocidadeKernel(Particula* particulasT, Particula* particulasT2, int numeroParticulas, float passoIntegracao, unsigned int* values) {
    int thread = threadIdx.x;
    int block = blockIdx.x;
    int dim = blockDim.x;
    int indiceValue = dim * block + thread;
    
    if (indiceValue < numeroParticulas) {
        int indiceParticulaAtual = values[indiceValue];

        particulasT2[indiceParticulaAtual].velocidade.x = particulasT[indiceParticulaAtual].velocidade.x + passoIntegracao / 2 * particulasT[indiceParticulaAtual].forcaAceleracao.x;
        particulasT2[indiceParticulaAtual].velocidade.y = particulasT[indiceParticulaAtual].velocidade.y + passoIntegracao / 2 * particulasT[indiceParticulaAtual].forcaAceleracao.y;
        particulasT2[indiceParticulaAtual].velocidade.z = 0;
    }
}

extern "C" void launch_VelocidadeKernel(unsigned int blocksPerGrid, unsigned int threadsPerBlock, Particula* particulasT, Particula* particulasT2, int numeroParticulas, float passoIntegracao, unsigned int* values) {
    // execute the kernel
    VelocidadeKernel << <blocksPerGrid, threadsPerBlock >> >(particulasT, particulasT2, numeroParticulas, passoIntegracao, values);
}


